package com.xasxt.book.app.web;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.IncorrectCredentialsException;
import org.apache.shiro.authc.UnknownAccountException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.crypto.hash.Md5Hash;
import org.apache.shiro.session.Session;
import org.apache.shiro.subject.Subject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import com.xasxt.book.app.entity.Log;
import com.xasxt.book.app.entity.Role;
import com.xasxt.book.app.entity.User;
import com.xasxt.book.app.service.LogService;
import com.xasxt.book.app.service.UserService;
/**
 * 
 * 功能:用户控制器
 * 开发者:虫儿飞
 * 开发时间:2018年5月19日 下午1:52:09
 */
@RestController
public class UserController {

	@Autowired
	private  UserService  userService;
	@Autowired
	private  LogService  logService;
	/**
	 * 
	 * 功能:删除用户角色
	 * 开发者:虫儿飞
	 * 开发时间:2018年5月26日 上午9:30:22
	 * @param
	 * @return
	 */
	@RequestMapping("delUseOfRoleInfo")
	public int  delUseOfRoleInfo(int uId) {
		Map<String,Object>map=new HashMap<String,Object>();
		User user=userService.getUserInfo(uId);


		if(user!=null) {
			List<Role>listRole=user.getListRole();
			map.put("uId", uId);
			for(Role r:listRole) {
				map.put("rId", r.getrId());
			}
			if(listRole.size()>0) {
				for(Role r:listRole) {
					if("admin".equals(r.getrName())) {
						return -2;//表示该用户是管理员不能删除该用户角色
					}else {
						return userService.delUseOfRoleInfo(map);
					}
				}
			}
		}
		return -3;
	

	}


	/**
	 * 
	 * 功能:用户分配角色
	 * 开发者:虫儿飞
	 * 开发时间:2018年5月20日 下午3:59:47
	 * @param uId
	 * @param rId
	 * @return
	 */
	@RequestMapping("saveRoleOfUserInfo")
	public int saveRoleOfUserInfo(Integer uId,Integer rId){
		Map<String,Object>map=new HashMap<String,Object>();
		map.put("uId", uId);
		map.put("rId", rId);

		return userService.saveRoleOfUserInfo(map)==true? 1:0;

	}
	@RequestMapping("zhuxiao")
	public void logout(HttpServletResponse resp,HttpServletRequest req) throws IOException {
		Subject subject=SecurityUtils.getSubject();
		Map<String,Object>map=new HashMap<String,Object>();
		Session session=subject.getSession();
		map.put("loginTime", (String)session.getAttribute("loginTime"));
		map.put("logoutTime", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
		logService.updateLogInfo(map);
		subject.logout();//退出
		resp.sendRedirect(req.getContextPath()+"/login.jsp");
		
		
		
	}

	/**
	 * 功能:登录
	 * 开发者:虫儿飞
	 * 开发时间:2018年5月19日 下午4:32:20
	 * @param email
	 * @param account
	 * @return
	 */
	@RequestMapping("login")
	public String login(String email,String account,HttpServletRequest req) {
		UsernamePasswordToken  token=new UsernamePasswordToken(email, account);
		Subject subject=SecurityUtils.getSubject();
		Session session=subject.getSession();
		if(!subject.isAuthenticated()) {
			try {
				subject.login(token);
				if(subject.isAuthenticated()) {
				
					Log log=new Log();
					log.setIp(req.getRemoteAddr());
					log.setLoginTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
					log.setEmail(email);
					session.setAttribute("loginTime", log.getLoginTime());
					if(logService.saveLogInfo(log)!=0) {
						System.out.print("日志记录成功");
	
					}else {
						System.out.println("日志记录失败");
					}
				}
			} catch (UnknownAccountException  e) {
				return "-1";//表示输入邮箱不存在
			} catch (IncorrectCredentialsException   e) {
				return "0";//输入账号不存在
			} catch (AuthenticationException    e) {
				return "-2";//认证失败
			}

		}
		return "1";

	}
	/**
	 * 
	 * 功能:添加用户信息
	 * 开发者:虫儿飞
	 * 开发时间:2018年5月20日 上午9:59:12
	 * @param user
	 * @return
	 */
	@RequestMapping("saveUserInfo")
	public boolean saveUserInfo(User user) {
		user.setAccount(new Md5Hash(user.getAccount(),
				user.getAccount()+user.getEmail(), 1000).toString());
		return userService.saveUserInfo(user);
	}
	/**
	 * 功能:分页查询
	 * 开发者:虫儿飞
	 * 开发时间:2018年5月20日 上午10:00:08
	 * @param page
	 * @param rows
	 * @param uName
	 * @return
	 */
	@RequestMapping("findUserWithPage")
	public Map<String,Object>findUserWithPage(int page,int rows,String uName){
		Map<String,Object>map=new HashMap<String,Object>();
		Subject suject=SecurityUtils.getSubject();
		Session session=	suject.getSession();
		User user=(User)session.getAttribute("user");
		if(user!=null) {
			map.put("email", user.getEmail());
			
		}
		List<Role> listRole=user.getListRole();
		for(Role r:listRole) {
			map.put("rName",r.getrName());
		}
		map.put("page", (page-1)*rows);
		map.put("rows", rows);
		map.put("uName", uName);
		Map<String,Object>mapResult=new HashMap<String,Object>();
		mapResult.put("total", userService.getUserCount(map));
		mapResult.put("rows", userService.findUserWithPage(map));
		return mapResult;
	}
	/**
	 * 功能:查询一个用户信息
	 * 开发者:虫儿飞
	 * 开发时间:2018年5月20日 下午1:40:11
	 * @param userId
	 * @return
	 */
	@RequestMapping(value="getUserInfo",method=RequestMethod.GET)
	public User getUserInfo(int userId) {
		return   userService.getUserInfo(userId);
	}
	/**
	 * 
	 * 功能:更新用户信息
	 * 开发者:虫儿飞
	 * 开发时间:2018年5月20日 下午1:41:45
	 * @param user
	 * @return
	 */
	@RequestMapping("updateUserInfo")
	public boolean   updateUserInfo(User user) {
		user.setAccount(new Md5Hash(user.getAccount(),
				user.getAccount()+user.getEmail(), 1000).toString());
		return userService.updateUserInfo(user);
	}
	/**
	 * 
	 * 功能:删除用户信息
	 * 开发者:虫儿飞
	 * 开发时间:2018年5月20日 下午1:43:27
	 * @param uIds
	 * @return
	 */
	@RequestMapping("delUserInfo")
	public boolean delUserInfo(@RequestParam("uIds[]")Integer uIds[]) {
		boolean flag=false;
		for(Integer  userId:uIds) {
			flag=userService.delUserInfo(userId);
		}
		return flag;
	}
	/**
	 * 
	 * 功能:根据用户ID查看底下的角色信息
	 * 开发者:虫儿飞
	 * 开发时间:2018年5月20日 下午3:35:31
	 * @param userId
	 * @return
	 */
	@RequestMapping("findUserByIdRoleInfo")
	public List<Role>findUserByIdRoleInfo(int userId){
		return  userService.findUserByIdRoleInfo(userId);
	}

}
